package cjyyp.bytebuf组件;

import cjyyp.util.ByteBufUtil;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;

import java.nio.charset.StandardCharsets;

/**
 * #### 池化 vs 非池化
 *
 * 池化的最大意义在于可以重用 ByteBuf，优点有
 *
 * * 没有池化，则每次都得创建新的 ByteBuf 实例，这个操作对直接内存代价昂贵，就算是堆内存，也会增加 GC 压力
 * * 有了池化，则可以重用池中 ByteBuf 实例，并且采用了与 jemalloc 类似的内存分配算法提升分配效率
 * * 高并发时，池化功能更节约内存，减少内存溢出的可能
 *
 * 池化功能是否开启，可以通过下面的系统环境变量来设置
 *
 * ```java
 * -Dio.netty.allocator.type={unpooled|pooled}
 * ```
 *
 * * 4.1 以后，非 Android 平台默认启用池化实现，Android 平台启用非池化实现
 * * 4.1 之前，池化功能还不成熟，默认是非池化实现
 */
public class 创建ByteBuf {
    public static void main(String[] args) {
        ByteBuf heapBuffer = ByteBufAllocator.DEFAULT.heapBuffer(20);//分配堆内存
        ByteBuf directBuffer = ByteBufAllocator.DEFAULT.directBuffer(20);//分配直接内存
        System.out.println(heapBuffer.getClass());//class io.netty.buffer.PooledUnsafeHeapByteBuf
        System.out.println(directBuffer.getClass());//class io.netty.buffer.PooledUnsafeDirectByteBuf  todo 含有Pooled，说明默认是池化

        heapBuffer.writeBytes(new byte[]{97,98});
        heapBuffer.writeCharSequence("cjyyp", StandardCharsets.UTF_8);
        ByteBufUtil.log(heapBuffer);
        heapBuffer.readByte();
        ByteBufUtil.log(heapBuffer);

        heapBuffer.release();//释放
    }
}
